import 'dart:io';
import 'package:url_launcher/url_launcher.dart';
import 'loading_util.dart';
import 'dart:developer' as developer;

/// 🗺️ 地图应用信息
class MapAppInfo {
  final String name;           // 地图应用名称
  final String icon;           // 图标（使用Flutter Icons）
  final String scheme;         // URL Scheme
  final bool isAvailable;      // 是否已安装
  final Future<bool> Function() launcher; // 启动函数
  
  MapAppInfo({
    required this.name,
    required this.icon,
    required this.scheme,
    required this.isAvailable,
    required this.launcher,
  });
}

/// 🗺️ 地图启动器工具类
/// 
/// 支持打开多种地图应用：
/// - 高德地图
/// - 百度地图
/// - 腾讯地图
/// - 苹果地图（iOS）
/// - Google Maps
/// - 系统默认地图
class MapLauncherUtil {
  
  /// 🎯 智能地图启动策略
  /// 
  /// 优先级顺序：
  /// 1. 高德地图（中国用户首选）
  /// 2. 百度地图（中国用户备选）
  /// 3. 腾讯地图
  /// 4. 苹果地图（iOS）/ Google Maps（Android）
  /// 5. 系统默认地图
  static Future<void> openMapLocation({
    required double latitude,
    required double longitude,
    required String locationName,
    String? title,
  }) async {
    try {
      developer.log('🗺️ =============== 开始智能地图启动 ===============');
      developer.log('📍 坐标: $latitude, $longitude');
      developer.log('📍 位置名称: $locationName');
      developer.log('📍 标题: ${title ?? "未提供"}');
      
      // 🎯 策略1: 尝试打开高德地图
      final amapSuccess = await _tryOpenAmap(latitude, longitude, locationName);
      if (amapSuccess) {
        developer.log('✅ 成功打开高德地图');
        LoadingUtil.success('已在高德地图中打开');
        return;
      }
      
      // 🎯 策略2: 尝试打开百度地图
      final baiduSuccess = await _tryOpenBaiduMap(latitude, longitude, locationName);
      if (baiduSuccess) {
        developer.log('✅ 成功打开百度地图');
        LoadingUtil.success('已在百度地图中打开');
        return;
      }
      
      // 🎯 策略3: 尝试打开腾讯地图
      final tencentSuccess = await _tryOpenTencentMap(latitude, longitude, locationName);
      if (tencentSuccess) {
        developer.log('✅ 成功打开腾讯地图');
        LoadingUtil.success('已在腾讯地图中打开');
        return;
      }
      
      // 🎯 策略4: 平台特定地图
      if (Platform.isIOS) {
        final appleSuccess = await _tryOpenAppleMaps(latitude, longitude, locationName);
        if (appleSuccess) {
          developer.log('✅ 成功打开苹果地图');
          LoadingUtil.success('已在苹果地图中打开');
          return;
        }
      } else {
        final googleSuccess = await _tryOpenGoogleMaps(latitude, longitude, locationName);
        if (googleSuccess) {
          developer.log('✅ 成功打开Google地图');
          LoadingUtil.success('已在Google地图中打开');
          return;
        }
      }
      
      // 🎯 策略5: 系统默认地图（兜底方案）
      final defaultSuccess = await _tryOpenDefaultMap(latitude, longitude, locationName);
      if (defaultSuccess) {
        developer.log('✅ 成功打开系统默认地图');
        LoadingUtil.success('已在默认地图中打开');
        return;
      }
      
      // 🚫 所有策略都失败
      developer.log('❌ 所有地图启动策略都失败');
      LoadingUtil.error('无法打开地图应用，请检查是否安装了地图软件');
      
    } catch (e) {
      developer.log('💥 地图启动异常: $e');
      LoadingUtil.error('打开地图失败');
    }
  }
  
  /// 🗺️ 尝试打开高德地图
  static Future<bool> _tryOpenAmap(double lat, double lng, String name) async {
    try {
      // 高德地图 URL Scheme
      final url = 'amapuri://route/plan/?dlat=$lat&dlon=$lng&dname=${Uri.encodeComponent(name)}&dev=0&t=0';
      
      developer.log('🎯 尝试打开高德地图: $url');
      
      final uri = Uri.parse(url);
      final canLaunch = await canLaunchUrl(uri);
      
      if (canLaunch) {
        return await launchUrl(uri, mode: LaunchMode.externalApplication);
      }
      
      developer.log('⚠️ 高德地图未安装或无法启动');
      return false;
      
    } catch (e) {
      developer.log('💥 打开高德地图失败: $e');
      return false;
    }
  }
  
  /// 🗺️ 尝试打开百度地图
  static Future<bool> _tryOpenBaiduMap(double lat, double lng, String name) async {
    try {
      // 百度地图 URL Scheme（使用目标点导航）
      final url = 'baidumap://map/marker?location=$lat,$lng&title=${Uri.encodeComponent(name)}&coord_type=gcj02&src=玩真的';
      
      developer.log('🎯 尝试打开百度地图: $url');
      
      final uri = Uri.parse(url);
      final canLaunch = await canLaunchUrl(uri);
      
      if (canLaunch) {
        return await launchUrl(uri, mode: LaunchMode.externalApplication);
      }
      
      developer.log('⚠️ 百度地图未安装或无法启动');
      return false;
      
    } catch (e) {
      developer.log('💥 打开百度地图失败: $e');
      return false;
    }
  }
  
  /// 🗺️ 尝试打开腾讯地图
  static Future<bool> _tryOpenTencentMap(double lat, double lng, String name) async {
    try {
      // 腾讯地图 URL Scheme
      final url = 'qqmap://map/routeplan?type=drive&tocoord=$lat,$lng&toname=${Uri.encodeComponent(name)}';
      
      developer.log('🎯 尝试打开腾讯地图: $url');
      
      final uri = Uri.parse(url);
      final canLaunch = await canLaunchUrl(uri);
      
      if (canLaunch) {
        return await launchUrl(uri, mode: LaunchMode.externalApplication);
      }
      
      developer.log('⚠️ 腾讯地图未安装或无法启动');
      return false;
      
    } catch (e) {
      developer.log('💥 打开腾讯地图失败: $e');
      return false;
    }
  }
  
  /// 🍎 尝试打开苹果地图（iOS）
  static Future<bool> _tryOpenAppleMaps(double lat, double lng, String name) async {
    try {
      // 苹果地图 URL Scheme
      final url = 'maps://?daddr=$lat,$lng&q=${Uri.encodeComponent(name)}';
      
      developer.log('🎯 尝试打开苹果地图: $url');
      
      final uri = Uri.parse(url);
      final canLaunch = await canLaunchUrl(uri);
      
      if (canLaunch) {
        return await launchUrl(uri, mode: LaunchMode.externalApplication);
      }
      
      developer.log('⚠️ 苹果地图无法启动');
      return false;
      
    } catch (e) {
      developer.log('💥 打开苹果地图失败: $e');
      return false;
    }
  }
  
  /// 🌍 尝试打开Google地图
  static Future<bool> _tryOpenGoogleMaps(double lat, double lng, String name) async {
    try {
      // Google Maps URL Scheme
      final url = 'google.navigation:q=$lat,$lng';
      
      developer.log('🎯 尝试打开Google地图: $url');
      
      final uri = Uri.parse(url);
      final canLaunch = await canLaunchUrl(uri);
      
      if (canLaunch) {
        return await launchUrl(uri, mode: LaunchMode.externalApplication);
      }
      
      // 尝试网页版 Google Maps
      final webUrl = 'https://www.google.com/maps/search/?api=1&query=$lat,$lng';
      final webUri = Uri.parse(webUrl);
      final canLaunchWeb = await canLaunchUrl(webUri);
      
      if (canLaunchWeb) {
        developer.log('🌐 使用网页版Google地图');
        return await launchUrl(webUri, mode: LaunchMode.externalApplication);
      }
      
      developer.log('⚠️ Google地图无法启动');
      return false;
      
    } catch (e) {
      developer.log('💥 打开Google地图失败: $e');
      return false;
    }
  }
  
  /// 🔧 尝试打开系统默认地图（兜底方案）
  static Future<bool> _tryOpenDefaultMap(double lat, double lng, String name) async {
    try {
      // 通用地理位置 URL（geo:）
      final url = 'geo:$lat,$lng?q=$lat,$lng(${Uri.encodeComponent(name)})';
      
      developer.log('🎯 尝试打开系统默认地图: $url');
      
      final uri = Uri.parse(url);
      final canLaunch = await canLaunchUrl(uri);
      
      if (canLaunch) {
        return await launchUrl(uri, mode: LaunchMode.externalApplication);
      }
      
      developer.log('⚠️ 系统默认地图无法启动');
      return false;
      
    } catch (e) {
      developer.log('💥 打开系统默认地图失败: $e');
      return false;
    }
  }
  
  /// 🎨 获取所有可用的地图应用列表
  /// 
  /// 返回已安装的地图应用信息，供用户选择
  static Future<List<MapAppInfo>> getAvailableMaps({
    required double latitude,
    required double longitude,
    required String locationName,
    String? title,
  }) async {
    developer.log('🗺️ =============== 检测可用地图应用 ===============');
    
    final List<MapAppInfo> availableMaps = [];
    
    // 🗺️ 高德地图
    final amapUrl = 'amapuri://route/plan/?dlat=$latitude&dlon=$longitude&dname=${Uri.encodeComponent(locationName)}&dev=0&t=0';
    final amapAvailable = await _checkMapAvailable(amapUrl);
    availableMaps.add(MapAppInfo(
      name: '高德地图',
      icon: 'navigation',
      scheme: amapUrl,
      isAvailable: amapAvailable,
      launcher: () => _tryOpenAmap(latitude, longitude, locationName),
    ));
    developer.log('📍 高德地图: ${amapAvailable ? "✅ 已安装" : "❌ 未安装"}');
    
    // 🗺️ 百度地图
    final baiduUrl = 'baidumap://map/marker?location=$latitude,$longitude&title=${Uri.encodeComponent(locationName)}&coord_type=gcj02&src=玩真的';
    final baiduAvailable = await _checkMapAvailable(baiduUrl);
    availableMaps.add(MapAppInfo(
      name: '百度地图',
      icon: 'map',
      scheme: baiduUrl,
      isAvailable: baiduAvailable,
      launcher: () => _tryOpenBaiduMap(latitude, longitude, locationName),
    ));
    developer.log('📍 百度地图: ${baiduAvailable ? "✅ 已安装" : "❌ 未安装"}');
    
    // 🗺️ 腾讯地图
    final tencentUrl = 'qqmap://map/routeplan?type=drive&tocoord=$latitude,$longitude&toname=${Uri.encodeComponent(locationName)}';
    final tencentAvailable = await _checkMapAvailable(tencentUrl);
    availableMaps.add(MapAppInfo(
      name: '腾讯地图',
      icon: 'location_on',
      scheme: tencentUrl,
      isAvailable: tencentAvailable,
      launcher: () => _tryOpenTencentMap(latitude, longitude, locationName),
    ));
    developer.log('📍 腾讯地图: ${tencentAvailable ? "✅ 已安装" : "❌ 未安装"}');
    
    // 🗺️ 平台特定地图
    if (Platform.isIOS) {
      // 苹果地图（iOS始终可用）
      availableMaps.add(MapAppInfo(
        name: '苹果地图',
        icon: 'map',
        scheme: 'maps://',
        isAvailable: true,
        launcher: () => _tryOpenAppleMaps(latitude, longitude, locationName),
      ));
      developer.log('📍 苹果地图: ✅ 系统自带');
    } else {
      // Google Maps
      final googleUrl = 'google.navigation:q=$latitude,$longitude';
      final googleAvailable = await _checkMapAvailable(googleUrl);
      availableMaps.add(MapAppInfo(
        name: 'Google Maps',
        icon: 'public',
        scheme: googleUrl,
        isAvailable: googleAvailable,
        launcher: () => _tryOpenGoogleMaps(latitude, longitude, locationName),
      ));
      developer.log('📍 Google Maps: ${googleAvailable ? "✅ 已安装" : "❌ 未安装"}');
    }
    
    final installedCount = availableMaps.where((m) => m.isAvailable).length;
    developer.log('✅ 检测完成：共${availableMaps.length}个地图应用，已安装${installedCount}个');
    
    return availableMaps;
  }
  
  /// 🔍 检查地图应用是否可用
  static Future<bool> _checkMapAvailable(String url) async {
    try {
      final uri = Uri.parse(url);
      return await canLaunchUrl(uri);
    } catch (e) {
      return false;
    }
  }
}

